#include <xmmintrin.h>

// ================================================================================================
// Dot product using SSE    
// ================================================================================================
__m128 DotProductSSE(const __m128& v1, const __m128& v2);

// ================================================================================================
// Dot product using SSE using data parallelism
// ================================================================================================
__m128 DotProductSSE4x4(const __m128 v1[4], const __m128 v2[4]);

// ================================================================================================
// Add using SSE using data parallelism
// ================================================================================================
void AddSSE4x4(const __m128 v1[4], const __m128 v2[4], __m128 res[4]);

// ================================================================================================
// Add using SSE 1x4
// ================================================================================================
void AddSSE1x4(const __m128& v1, const __m128 v2[4], __m128 res[4]);

// ================================================================================================
// Add using SSE 4x1
// ================================================================================================
void AddSSE4x1(const __m128 v1[4], const __m128& v2, __m128 res[4]);

// ================================================================================================
// Multiply using SSE using data parallelism
// ================================================================================================
void MulSSE4x4(const __m128 v1[4], const __m128 v2[4], __m128 res[4]);

// ================================================================================================
// Multiply using SSE 1x4
// ================================================================================================
void MulSSE1x4(const __m128& v1, const __m128 v2[4], __m128 res[4]);

// ================================================================================================
// Multiply using SSE 4x1
// ================================================================================================
void MulSSE4x1(const __m128 v1[4], const __m128& v2, __m128 res[4]);

// ================================================================================================
// Find the fabs of the _m128
// ================================================================================================
__m128 FAbsSSE(const __m128 val);

// ================================================================================================
// Divide using SSE 1x4
// ================================================================================================
void DivSSE1x4(const __m128& v1, const __m128 v2[4], __m128 res[4]);

// ================================================================================================
// Divide using SSE 4x1
// ================================================================================================
void DivSSE4x1(const __m128 v1[4], const __m128& v2, __m128 res[4]);
